#include "menu_service.h"

arr_list *list = NULL;

//菜单
void menu() {
    list = init_app();  // 初始化数据
    sequence_print_video(list);  // 打印链表

    pthread_t th1, th2, th3;

    // 创建线程监控点击动作
    int ret = pthread_create(&th1, NULL, execute_action, NULL);
    if (ret != 0) {
        perror("pthread_create");
    }

    // 创建线程进行无名管道读操作
    ret = pthread_create(&th2, NULL, pipe_read_action, NULL);
    if (ret != 0) {
        perror("pthread_create");
    }

    // 创建线程进行有名管道写操作
    ret = pthread_create(&th3, NULL, fifo_write_action, NULL);
    if (ret != 0) {
        perror("pthread_create");
    }

    // 等待线程
    pthread_join(th1, NULL);
    pthread_join(th2, NULL);
    pthread_join(th3, NULL);
}

// 初始化
arr_list *init_app() {
    // 顺序表以及文件初始化
    list = sequence_create();            // 创建顺序表
    get_video_path(list, video_dir);     // 获取视频路径
    get_video_preview(list, video_dir);  // 获取视频预览图
    create_fifo();                       // 创建有名管道
    create_pipe();                       // 创建无名管道

    printf("================\n");
    sequence_print_video(list);
    printf("================\n");

    // 初始化当前信息
    state.count_video = list->size;                             // 视频数量
    state.position = 0;                                         // 初始位置
    state.page = 1;                                             // 初始页面
    state.count_page = (list->size) / PAGE_NUM + 1;             // 总页面数
    strcpy(state.video_name, ((video *)(list->data[0]))->name); // 初始视频名

    // 初始化LCD屏幕
    lcd_init();                     // 初始化LCD屏幕
    show_bottom_button();           // 显示底部按钮
    show_right_list(state.page);    // 显示右边预览图,初始时为1
    show_page_button();             // 显示上下翻译按钮
    show_progress_dialog();         // 显示进度框
    // lcd_uninit();                // 解除映射

    // video_view(((video *)(list->data[0]))->absolute_path);  // 播放视频
    return list;
}

// 根据点击位置执行相关动作
void *execute_action(void *args) {
    while (1) {
        int coord[2] = {0, 0};  // 坐标(x,y)
        get_touch_location(coord);  // 获取坐标
        narrow_down(&coord[0], &coord[1]); // 坐标压缩
        printf("pid = %u\n", state.pid);

        // 按到上一部
        if (40 <= coord[0] && 40 + 80 >= coord[0] && 400 <= coord[1] && 400 + 80 >= coord[1]) {
            video_prev(list);
            printf("prev\n");
        }

        // 按到左快进
        if (160 <= coord[0] && 160 + 80 >= coord[0] && 400 <= coord[1] && 400 + 80 >= coord[1]) {
            video_speed_left();
            printf("speed left\n");
        }

        // 按到暂停
        if (280 <= coord[0] && 280 + 80 >= coord[0] && 400 <= coord[1] && 400 + 80 >= coord[1]) {
            video_pause();
            printf("pause\n");
        }

        // 按到右快进
        if (400 <= coord[0] && 400 + 80 >= coord[0] && 400 <= coord[1] && 400 + 80 >= coord[1]) {
            video_speed_right();
            printf("speed right\n");
        }

        // 按到下一部
        if (520 <= coord[0] && 520 + 80 >= coord[0] && 400 <= coord[1] && 400 + 80 >= coord[1]) {
            video_next(list);
            printf("next\n");
        }

        // 按到视频列表的某一个视频预览图
        for (int i = 1; i <= state.page_video_num; i++) {
            if (680 <= coord[0] && 680 + 80 >= coord[0] && 65 + 80 * (i - 1) <= coord[1] && 65 + 80 * i >= coord[1]) {
                video_option(list, i);
                printf("option\n");
            }
        }

        // 按到向上翻页
        if (680 <= coord[0] && 680 + 80 >= coord[0] && 7 <= coord[1] && 7 + 48 >= coord[1]) {
            video_page_upward();
            printf("upward\n");
        }

        // 按到向下翻页
        if (680 <= coord[0] && 680 + 80 >= coord[0] && 425 <= coord[1] && 425 + 48 >= coord[1]) {
            video_page_down();
            printf("down\n");
        }

    }
    return NULL;
}

// 监控自动操作
void *pipe_read_action(void *args) {
    // 获取无名管道的读端数据
    char buf[100], num_buf[10];
    close(fd_pipe[1]);  // 关闭读端
    int size = 0, progress;
    while (1) {
        if (fd_pipe[0] != 0) {  // 当没有视频播放时不进去
            memset(buf, 0, sizeof(buf));
            size = read(fd_pipe[0], buf, sizeof(buf)); //从无名管道的写端读取信息
            if (size == 0)
                continue;

            buf[size] = '\0';
            printf("th msg read form pipe is [%s]\n", buf);
            if (strstr(buf, "ANS_PERCENT_POSITION=") != NULL) {  // 是目标消息(视频进度百分比)
                memset(num_buf, 0, sizeof(num_buf));

                // 截取字符串获取数字
                strtok(buf, "=");
                strcpy(num_buf, strtok(NULL, "="));

                progress = atoi(num_buf); // 字符串转成int
                printf("progress = %d\n", progress);
                show_progress_bar(progress);  // 修改进度条
            }
        }
    }
    return NULL;
}

// 发送参数，获取视频进度
void *fifo_write_action(void *arg) {
    while (1) {
        sleep(2);
        if (state.is_pause == 0) {
            int fd = open("./myfifo", O_RDWR);
            if (-1 == fd) {
                perror("open_ifo error");
                exit(1);
            }
            write(fd, "get_percent_pos\n", strlen("get_percent_pos\n"));
            close(fd);
        }
    }
    return NULL;
}